package com.inspur.project.system.service.impl;

import com.github.tobato.fastdfs.domain.conn.FdfsWebServer;
import com.github.tobato.fastdfs.domain.fdfs.DefaultThumbImageConfig;
import com.inspur.common.utils.StringUtils;
import com.inspur.common.utils.file.FastDFSClient;
import com.inspur.common.utils.text.PatternExtract;
import com.inspur.project.constant.CommonChar;
import com.inspur.project.system.domain.SysNotice;
import com.inspur.project.system.mapper.SysNoticeMapper;
import com.inspur.project.system.service.ISysNoticeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 公告 服务层实现
 *
 * @author inspur_ict
 */
@Service
public class SysNoticeServiceImpl implements ISysNoticeService {
    @Autowired
    private SysNoticeMapper noticeMapper;

    @Autowired
    private FastDFSClient fastDFSClient;

    @Autowired
    private FdfsWebServer fdfsWebServer;

    @Autowired
    private DefaultThumbImageConfig defaultThumbImageConfig;

    /**
     * 查询公告信息
     *
     * @param noticeId 公告ID
     * @return 公告信息
     */
    @Override
    public SysNotice selectNoticeById(Long noticeId) {
        return noticeMapper.selectNoticeById(noticeId);
    }

    /**
     * 查询公告列表
     *
     * @param notice 公告信息
     * @return 公告集合
     */
    @Override
    public List<SysNotice> selectNoticeList(SysNotice notice) {
        return noticeMapper.selectNoticeList(notice);
    }

    /**
     * 新增公告
     *
     * @param notice 公告信息
     * @return 结果
     */
    @Override
    public int insertNotice(SysNotice notice) {
        processNoticeImg(notice);
        return noticeMapper.insertNotice(notice);
    }

    /**
     * 处理图片路径问题，可实时删除冗余图片
     * 从富文本中提取实际用到的图片路径，与实际返回到前台的图片路径进行对比取差集，差集即为需要删除的图片，将实际剩下的图片转为字符串赋给filePath
     *
     * @param notice
     */
    private void processNoticeImg(SysNotice notice) {
        List<String> picturePaths = new ArrayList<>(Arrays.asList(notice.getFilePath().split(CommonChar.SPLIT_CHAR))); //前台提交过来的图片列表
        List<String> tempUrls = new ArrayList<>(); //用于保存实际文本中的图片路径
        List<String> imgUrls = PatternExtract.extractImg(notice.getNoticeContent());
        if (picturePaths.size() > 0) {
            if (imgUrls.size() > 0) {
                tempUrls = imgUrls.stream().map(item -> {
                    item = item.replace("http://" + fdfsWebServer.getWebServerUrl(), "");
                    item = item.replace(defaultThumbImageConfig.getPrefixName(), "");
                    return item;
                }).collect(Collectors.toList());
                picturePaths.removeAll(tempUrls);
            }
            if (picturePaths.size() > 0) {
                fastDFSClient.deleteImageWithThumbImage(picturePaths.toArray(new String[picturePaths.size()]));
            }
            notice.setFilePath(String.join(CommonChar.SPLIT_CHAR, tempUrls));
        }
    }

    /**
     * 修改公告
     *
     * @param notice 公告信息
     * @return 结果
     */
    @Override
    public int updateNotice(SysNotice notice) {
        processNoticeImg(notice);
        return noticeMapper.updateNotice(notice);
    }

    /**
     * 删除公告对象
     *
     * @param noticeId 公告ID
     * @return 结果
     */
    @Override
    public int deleteNoticeById(Long noticeId) {
        SysNotice sysNotice = this.selectNoticeById(noticeId);
        if (StringUtils.isNotEmpty(sysNotice.getFilePath())) {
            fastDFSClient.deleteImageWithThumbImage(sysNotice.getFilePath().split(CommonChar.SPLIT_CHAR));
        }
        return noticeMapper.deleteNoticeById(noticeId);
    }

    /**
     * 批量删除公告信息
     *
     * @param noticeIds 需要删除的公告ID
     * @return 结果
     */
    public int deleteNoticeByIds(String noticeIds) {
        int count = 0;
        if (StringUtils.isNotEmpty(noticeIds)) {
            String[] ids = noticeIds.split(CommonChar.SPLIT_CHAR);
            for (String id : ids) {
                this.deleteNoticeById(Long.parseLong(id));
                count++;
            }
        }
        return count;
    }
}
